<?php

class Email {
	static  $instancia;
	private $mime_version = '1.0';
	private $content_type = 'text/html';
	private $charset = 'UTF-8';
	private $from;
	private $x_priority = 3;
	private $return_path;
	private $reply_to;
	private $mensagem;
	private $assunto;
	private $cc;
	private $cco;
	private $destinaratio;
	private $remetente;

	/**
	 * Instancia singleton do objeto Email
	 * 
	 * @return Email
	 */
	public static function Instanciar(){
		if(self::$instancia == ''){
			self::$instancia = new Email;
		}
		return self::$instancia;
	}

	//----------------- GETTERS AND SETTERS
	public function GetMimeVersion() {
		return $this->mime_version;
	}
	public function GetContentType() {
		return $this->content_type;
	}
	public function GetCharset() {
		return $this->charset;
	}
	public function GetFrom() {
		return $this->from;
	}
	public function GetXPriority() {
		return $this->x_priority;
	}
	public function GetReturnPath() {
		return $this->return_path;
	}
	public function GetReplyTo() {
		return $this->reply_to;
	}
	public function GetMensagem() {
		return $this->mensagem;
	}
	public function GetAssunto() {
		return $this->assunto;
	}
	public function GetCc() {
		return $this->cc;
	}
	public function GetCco() {
		return $this->cco;
	}
	public function GetDestinaratio() {
		return $this->destinaratio;
	}
	public function GetRemetente() {
		return $this->remetente;
	}

	public function SetMimeVersion($mime_version) {
		$this->mime_version = $mime_version;
	}
	public function SetContentType($content_type) {
		$this->content_type = $content_type;
	}
	public function SetCharset($charset) {
		$this->charset = $charset;
	}
	public function SetFrom($from) {
		$this->from = $from;
	}
	public function SetXPriority($x_priority) {
		$this->x_priority = $x_priority;
	}
	public function SetReturnPath($return_path) {
		$this->return_path = $return_path;
	}
	public function SetReplyTo($reply_to) {
		$this->reply_to = $reply_to;
	}
	public function SetMensagem($mensagem) {
		$this->mensagem = $mensagem;
	}
	public function SetAssunto($assunto) {
		$this->assunto = $assunto;
	}
	public function SetCc($cc) {
		$this->cc = $cc;
	}
	public function SetCco($cco) {
		$this->cco = $cco;
	}
	public function SetDestinaratio($destinaratio) {
		$this->destinaratio = $destinaratio;
	}
	public function SetRemetente($remetente) {
		$this->remetente = $remetente;
	}
	//----------------- FIM DOS GETTERS AND SETTERS

	/**
	 * Método pseudo-magico para dar get nas propriedades da classe
	 * @param string $prop
	 * @return mixed
	 */
	public function _get($prop){
		return $this->$prop;
	}

	/**
	 * Método pseudo-mágico para setar propriedades dentro da classe
	 * @param string $prop
	 * @param mixed $valor
	 */
	public function _set($prop, $valor){
		$this->$prop = $valor;
	}

	/**
	 * Esta é a função principal de envio, considera tudo que foi configurado nas propriedades e envia 
	 * utilizando php mail()
	 *
	 * @return boolean
	 */
	public function Enviar($display_error){
		$header = $this->MontaCabecalho();
		if($display_error){
			$email = mail($this->destinaratio, $this->assunto, $this->mensagem, $this->MontaCabecalho());
		}else{
			$email = @mail($this->destinaratio, $this->assunto, $this->mensagem, $this->MontaCabecalho());
		}

		if($email){
			return true;
		}else{
			return false;
		}
	}

	/**
	 * Monta o cabeçalho do email de acordo com a configuração das propriedades
	 */
	private function MontaCabecalho(){
		$LD = ($this->VerificaOS() == 'windows') ? "\n\r" : "\n";

		$headers  = "MIME-Version: {$this->mime_version}$LD";
		$headers .= "Content-type: {$this->content_type}; charset={$this->charset}$LD";
		$headers .= ($this->x_priority) ? "X-Priority: {$this->x_priority}$LD" : '';
		$headers .= ($this->cco) ? "Bcc: $this->cco" : '';
		$headers .= ($this->cc) ? "Cc: $this->cc" : '';

		if($this->VerificaOS() == 'windows'){
			$headers .= ($this->from) 		?	"From: {$this->from}$LD" 			: '';
			$headers .= ($this->return_path)	? 	"Return-Path: {$this->from}$LD" 	: '';
			$headers .= ($this->reply_to) 		? 	"Reply-To: {$this->reply_to}$LD" 	: '';
		}else{
			$headers .= ($this->from) 		? 	"From: {$this->return_path}<{$this->return_path}>$LD" 			: '';
			$headers .= ($this->return_path) 	? 	"Return-Path: {$this->return_path}<{$this->return_path}>$LD" 	: '';
			$headers .= ($this->reply_to) 		? 	"Reply-To: {$this->reply_to}<{$this->reply_to}>$LD" 			: '';
		}

		return $headers;
	}

	/**
	 * Verifica o sistema operacional onde o aplicativo está instalado
	 */
	public function VerificaOS(){
		if(stristr($_SERVER['SERVER_SOFTWARE'],'win')){
		    return 'windows';
		}else{
		    return 'linux';
		}
	}
}